/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:  ISP模块头文件
  Function List: 
  History:
    <wumj -- 2016-09-21>  创建
*******************************************************************************/
#ifndef VIDEO_ISP_H
#define VIDEO_ISP_H

/*=============================================================================
                                 Includes                                  
==============================================================================*/
#include "videoComm.h" 
#include "VideoIn.h" 

/*=============================================================================
                               Macro Definition
 =============================================================================*/ 

/*=============================================================================
                        Local Structures and Typedef 
 =============================================================================*/ 

typedef enum 
{
	ISP_MODE_VIDEO,			           /* 视频帧模式 */
	ISP_MODE_FLASH,				       /* 抓拍帧模式 */
} VIDEOISP_paramMode_t;


/* ISP控制模式，用于区分不同控制模式。如果不同平台引起的差异 */
typedef enum
{
    VIDEOISP_MODE_COMM,
} VIDEOISP_ctlMode_t;


/* 视频ISP媒体层初始化参数，128字节 */
typedef struct VIDEOISP_funcStart_t
{
        int reserved[32];
} VIDEOISP_funcStart_t;


/* 视频ISP功能项初始化参数，128字节 */
typedef struct VIDEOISP_funcInit_t
{
    VIDEO_snsType_t     snsType;               /* sensor类型 */
    VIDEO_standard_t    standard;              /* 图像制式 */
    VIDEO_resolution_t  resolution;            /* 图像分辨率 */
    VIDEO_wdrMode       wdrMode;			   /* 宽动态模式 */
    float               fps;                   /* 帧率 */
    VIDEOISP_ctlMode_t  ispMode;               /* ISP控制模式 */
	char *pLenName;                            /* 镜头名 */
    int reserved[25];                          /* 保留字段 */
} VIDEOISP_funcInit_t;


/* 视频ISP模式切换参数 */
typedef struct VIDEOISP_Mode_t
{
    VIDEO_standard_t    standard;              /* 图像制式 */
    VIDEO_resolution_t  resolution;            /* 图像分辨率 */
    VIDEO_wdrMode       wdrMode;			   /* 宽动态模式 */
    float               fps;                   /* 帧率 */
    VIDEOISP_ctlMode_t  ispMode;               /* ISP控制模式 */
    int reserved[11];                          /* 保留字段 */
} VIDEOISP_Mode_t;


/* 视频isp接口描述，128字节 */
typedef struct VIDEOISP_desc_t
{
	int				channel;		           /* 物理通道号 */
	int				reserved[31];	           /* 保留字段 */
} VIDEOISP_desc_t;


/* 视频ISP接口描述，256字节 */
typedef struct VIDEOISP_initParam_t
{
    VIDEO_snsType_t     snsType;               /* sensor类型 */
    VIDEO_standard_t    standard;              /* 图像制式 */
    VIDEO_resolution_t  resolution;            /* 图像分辨率 */
    VIDEO_wdrMode       wdrMode;			   /* 宽动态模式 */
    float               fps;                   /* 帧率 */
    VIDEOISP_ctlMode_t  ispMode;               /* ISP控制模式 */
    char *pLenName;                            /* 镜头名 */
    /* bit0 0:定焦镜头 1: 变焦镜头 */
    int flags;

    int reserved[24];                          /* 保存字段 */

    /* 不同模式下的定制化参数 */
    union
    {
        int modeReserved[32];
    };
} VIDEOISP_initParam_t;

 
/* 视频ISP接口，256字节 */
typedef struct VIDEOISP_ctl_t
{ 
	/* 底层私有数据 */
	void *pPriv; 
 
	/*************************************************************************** 
        Description:  释放接口
        Input:        - pThiz: 接口指针 
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
	int (*pRelease)(struct VIDEOISP_ctl_t *pThiz);

    /*************************************************************************** 
        Description:  设置运行参数
        Input:        - pThiz: 接口指针
                      - pOption: 参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetOption)(struct VIDEOISP_ctl_t *pThiz, VideoInOptions *pOption);
  
    /*************************************************************************** 
        Description:  设置预览参数
        Input:        - pThiz: 接口指针
                      - pOption: 预览参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetPreviewOptions)(struct VIDEOISP_ctl_t *pThiz, VideoInPreviewOptions *pOption);
     
    /*************************************************************************** 
        Description:  设置视频色彩参数，亮度、对比度、饱和度、色相
        Input:        - pThiz: 接口指针
                      - pColor: 视频色彩参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetColor)(struct VIDEOISP_ctl_t *pThiz, VideoColor *pColor);
  
    /*************************************************************************** 
        Description:  获取视频输入状态
        Input:        - pThiz: 接口指针
                      - pStatus: 视频输入状态
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetVinStatus)(struct VIDEOISP_ctl_t *pThiz, VideoInStatus *pStatus);
  
    /*************************************************************************** 
        Description:  使能自动光圈
        Input:        - pThiz: 接口指针
                      - enable: 1使能 0禁止
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pEnableAutoIris)(struct VIDEOISP_ctl_t *pThiz, int enable);
 
    /*************************************************************************** 
        Description:  设置聚焦模式
        Input:        - pThiz: 接口指针
                      - mode: 聚焦模式，0-关闭，1-辅助，2-自动
                      - pOptions: 聚焦算法选项结构体指针
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetFocusMode)(struct VIDEOISP_ctl_t *pThiz, int mode, VideoInFocusOptions* pOptions);
  
	/*************************************************************************** 
        Description:  取聚焦状态，辅助聚焦模式下有效
        Input:        - pThiz: 接口指针
                      - pStatus: 聚焦状态结构体指针
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetFocusStatus)(struct VIDEOISP_ctl_t *pThiz, VideoInFocusStatus* pStatus);
  
	/*************************************************************************** 
        Description:  聚焦调节，调节放大倍率和焦点
        Input:        - pThiz: 接口指针
                      - focus: 相对焦点变化，归一化到-1~1
                      - zoom: 相对变倍率，归一化到-1~1
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pAdjustFocus)(struct VIDEOISP_ctl_t *pThiz, float focus, float zoom);
  
	/*************************************************************************** 
        Description:  自动聚焦，调节焦点至最佳位置
        Input:        - pThiz: 接口指针 
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pAutoFocus)(struct VIDEOISP_ctl_t *pThiz);
  
	/*************************************************************************** 
        Description:  持续聚焦调节，调节放大倍率和焦点
        Input:        - pThiz: 接口指针 
                      - focus: 相对焦点变化，归一化到-1~1
                      - zoom: 相对变倍率，归一化到-1~1
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pAdjustFocusContinuously)(struct VIDEOISP_ctl_t *pThiz, float focus, float zoom);
  
	/*************************************************************************** 
        Description:  设置聚焦参数
        Input:        - pThiz: 接口指针 
                      - pFocus: 聚焦参数结构体 
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetFocus)(struct VIDEOISP_ctl_t *pThiz, const VideoInFocus * pFocus);
  
	/*************************************************************************** 
        Description:  设置聚焦参数
        Input:        - pThiz: 接口指针 
                      - pZoom: 聚焦参数结构体 
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetZoom)(struct VIDEOISP_ctl_t *pThiz, const VideoInZoom * pZoom); 
  
	/*************************************************************************** 
        Description:  sensor重启
        Input:        - pThiz: 接口指针  
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSnsReboot)(struct VIDEOISP_ctl_t *pThiz);
  
	/*************************************************************************** 
        Description:  设置smartIr
        Input:        - pThiz: 接口指针  
                      - pSmartIrPrm: smartIr参数结构体 
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetSmartIr)(struct VIDEOISP_ctl_t *pThiz, const VideoInSmartIrParams *pSmartIrPrm);
  
	/*************************************************************************** 
        Description:  设置自动光圈参数
        Input:        - pThiz: 接口指针  
                      - pAutoIrisPrm: 自动光圈参数结构体
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetAutoIris)(struct VIDEOISP_ctl_t *pThiz, const VideoInAutoIrisParams *pAutoIrisPrm);
  
	/*************************************************************************** 
        Description:  获取曝光参数
        Input:        - pThiz: 接口指针  
                      - standard: 视频制式
                      - pLevel: 曝光速度控制等级数，支持的曝光等级数，包括自动曝光。
                                0-不支持曝光控制，1-只支持自动曝光，2..n-曝光等级数。
                      - speeds: 时间列表数组，数量由ISP_GetExposureLevel接口指定
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetExposureSpeeds)(struct VIDEOISP_ctl_t *pThiz, VideoStandard standard, int *pLevel, float* speeds);
  
	/*************************************************************************** 
        Description:  获取视频输入状态
        Input:        - pThiz: 接口指针  
                      - pStatus: 视频输入预处理状态结构体指针
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetStatus)(struct VIDEOISP_ctl_t *pThiz, VideoInStatus *pStatus);
  
	/*************************************************************************** 
        Description:  设置设置白平衡参数
        Input:        - pThiz: 接口指针  
                      - pWhiteBalance: 白平衡参数结构体
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetWhiteBalance)(struct VIDEOISP_ctl_t *pThiz, const VideoInWhiteBalance *pWhiteBalance);

	/*************************************************************************** 
        Description:  设置isp参数模式
        Input:        - pThiz: 接口指针   
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSwitchParam)(struct VIDEOISP_ctl_t *pThiz, VIDEOISP_paramMode_t mode);

	/*************************************************************************** 
        Description:  切换宽动态模式
        Input:        - pThiz: 接口指针   
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pChangeWdrMode)(struct VIDEOISP_ctl_t *pThiz, VIDEO_wdrMode mode);

	/*************************************************************************** 
        Description:  获取镜头信息
        Input:        - pThiz: 接口指针   
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetLenInfo)(struct VIDEOISP_ctl_t *pThiz, VIDEO_lenInfo_t *pLenInfo);    

	/*************************************************************************** 
        Description:  启动isp
        Input:        - pThiz: 接口指针   
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pFuncStart)(struct VIDEOISP_ctl_t *pThiz); 

    /*************************************************************************** 
        Description:  停止isp
        Input:        - pThiz: 接口指针   
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pFuncStop)(struct VIDEOISP_ctl_t *pThiz); 

   	/*************************************************************************** 
        Description:  isp初始化
        Input:        - pThiz: 接口指针   
        			  - pPrm: 初始化参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pFuncInit)(struct VIDEOISP_ctl_t *pThiz, VIDEOISP_funcInit_t *pPrm); 

    /*************************************************************************** 
        Description:  isp去初始化
        Input:        - pThiz: 接口指针   
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pFuncDeinit)(struct VIDEOISP_ctl_t *pThiz);

    /*************************************************************************** 
        Description:  设置光圈参数
        Input:        - pThiz: 接口指针 
        			  - pIrisPrm: 光圈参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetIris)(struct VIDEOISP_ctl_t *pThiz, const VideoInIrisParams *pIrisPrm);

    /*************************************************************************** 
        Description:  获取镜头列表
        Input:        - pThiz: 接口指针 
        			  - pLenTbl: 可选镜头列表
        			  - pNum: 可选镜头数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetLenTable)(struct VIDEOISP_ctl_t *pThiz, char (*pLenTbl)[32], int *pNum);

    /*************************************************************************** 
        Description:  设置数字防抖参数
        Input:        - pThiz: 接口指针 
        			  - pDisPrm: 数字防抖参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetDis)(struct VIDEOISP_ctl_t *pThiz, const VideoInDisPrm *pDisPrm);

    /*************************************************************************** 
        Description:  设置ISP模式(涉及sensor改变)
        Input:        - pThiz: 接口指针 
        			  - pMode: 模式参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetMode)(struct VIDEOISP_ctl_t *pThiz, const VIDEOISP_Mode_t *pMode);

    /*************************************************************************** 
        Description:  设置视频色彩参数，亮度、对比度、饱和度、色相
        Input:        - pThiz: 接口指针
                      - pColor: 视频色彩参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetColor)(struct VIDEOISP_ctl_t *pThiz, VideoColor *pColor);

    /*************************************************************************** 
        Description:  设置运行参数
        Input:        - pThiz: 接口指针
                      - pOption: 参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pGetOption)(struct VIDEOISP_ctl_t *pThiz, VideoInOptions *pOption);

    /*************************************************************************** 
        Description:  设置运行参数
        Input:        - pThiz: 接口指针
                      - pOption: 参数
        Output:       无
        Return:        0: 操作成功
                      <0: 操作失败
        Others:       无
    ***************************************************************************/
    int (*pSetMirrorFlip)(struct VIDEOISP_ctl_t *pThiz,int mirror, int flip);

    /* 保留字段 */
	int reserved[30];
}VIDEOISP_ctl_t;

/*=============================================================================
                             Function Declar                                 
==============================================================================*/ 

/*******************************************************************************
  Function:     VIDEOISP_Create
  Description:  创建视频ISP接口
  Input:        - pInitParams: 视频ISP接口描述结构指针
  Output:       - ppVideoIsp: 视频ISP接口指针的指针
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/ 
int VIDEOISP_Create(VIDEOISP_initParam_t *pInitParams, VIDEOISP_ctl_t **ppVideoIsp);

/*******************************************************************************
  Function:     VIDEOISP_Create
  Description:  创建视频ISP接口
  Input:        - pDesc: 视频isp接口描述
  Output:       - ppVideoIsp: 视频ISP接口指针的指针
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/ 
int VIDEOISP_CreateEx(VIDEOISP_desc_t *pDesc, VIDEOISP_ctl_t **ppVideoIsp);

#endif  /*VIDEO_ISP_H*/
